package com.xjtu.mybatisplus.service;

import com.xjtu.mybatisplus.common.JsonResponse;
import com.xjtu.mybatisplus.common.result.PageResult;
import com.xjtu.mybatisplus.model.domain.Article;
import com.xjtu.mybatisplus.model.domain.Review;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xjtu.mybatisplus.model.dto.ReviewDto;
import com.xjtu.mybatisplus.model.vo.SubNoticeVo;
import com.xjtu.mybatisplus.model.vo.reviewVo.ReviewStaticVo;
import com.xjtu.mybatisplus.model.vo.reviewVo.ReviewVo;
import com.xjtu.mybatisplus.model.vo.reviewVo.ReviewerVo;

import java.util.List;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author lsong
 * @since 2023-12-27
 */
public interface ReviewService extends IService<Review> {

    /**
     * 某个审核人员获取其审核任务分页
     * @param reviewId
     * @param page
     * @param pageSize
     * @return
     */
    JsonResponse<PageResult> getTaskById(Long reviewId, Integer page, Integer pageSize);

    /**
     * 获取审核任务分页
     * @param page
     * @param pageSize
     * @return
     */
    JsonResponse<PageResult> getAllTask(Integer page, Integer pageSize);

    /**
     * 审核人员提交审核
     * @param reviewDto
     * @return
     */
    JsonResponse update(ReviewDto reviewDto);

    /**
     * 插入审核信息
     * 应该要自动更新库 是否需要自动分配
     * @param articleId
     * @param phase
     * @return
     */
     JsonResponse insert(Long articleId, Integer phase);


    /**
     * 库中容量太大，需要自动分配
     * todo： 还没有办法在分配文章时做到不重复向一个审核员分配同一篇文章的不同阶段
     * @return
     */
    boolean assignReview();


    /**
     * 员工自己吃饱没事干申请审核
     * 已优化，不会申请到自己审核过的文章
     * @param reviewId
     * @return
     */
    JsonResponse applyReview(Long reviewId);

    /**
     * 获取所有没分配的审核任务
     * 即user_Id = -1
     * @return
     */
    List<Review> getUnreviewList();

    /**
     * 通过算法获取自动分配的审核人员
     * @return
     */
    Long getReviewer();


    /**
     * 获取文章
     *
     * @param articleId
//     * @param reviewId
     * @return
     */
    JsonResponse<Article> getArticle(Long articleId);

    /**
     * 获取某个审核所有未完成的审核任务
     *
     * @param reviewId
     * -1代表管理员获取
     * @return
     */
    JsonResponse<List<ReviewVo>> getUndoList(Long reviewId);

    /**
     * 一篇文章想要修改，就必须重置审核状态
     * 是给采编人员用的
     * @param articleId
     * @return
     */
    boolean resetReview(Long articleId);

    /**
     * 用于管理员获取所有审核人员的信息，包括文章审核数
//     * @param page
//     * @param pageSize
     * @return
     */
    JsonResponse<List<ReviewerVo>>getReviewerList();

    /**
     * [todo] 这个方法非常庞大，得加载很久很久，不知道怎么解决
     * @param reviewId
     * @return
     */
    JsonResponse<ReviewStaticVo> getStatic(Long reviewId);


    Boolean generateNotice(Long articleId);
}
